#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>


#define LARGEUR_ECRAN 800
#define HAUTEUR_ECRAN 600
#define LARGEUR_BASE 50
#define LONGUEUR_BASE 100
#define LARGEUR_GRAND_BRAS 30
#define LONGUEUR_GRAND_BRAS 400
#define LARGEUR_PETIT_BRAS 20
#define LONGUEUR_PETIT_BRAS 100
#define COTE_CAISSE 30

void dessinerGrue(int longueur,int petit_angle,int grand_angle)
{
    glBegin(GL_QUADS);
    glColor3ub(255,0,0);
    glVertex2d(50,LARGEUR_BASE);
    glColor3ub(255,0,0);
    glVertex2d(50+LONGUEUR_BASE,LARGEUR_BASE);
    glColor3ub(255,0,0);
    glVertex2d(50+LONGUEUR_BASE,0);
    glColor3ub(255,0,0);
    glVertex2d(50,0);
    glEnd();

    glTranslated(50+LONGUEUR_BASE/2-LARGEUR_GRAND_BRAS/2,LARGEUR_BASE,0);
    glRotated(grand_angle,0,0,1);

    glBegin(GL_QUADS);
    glColor3ub(255,0,0);
    glVertex2d(0,0);
    glColor3ub(255,0,0);
    glVertex2d(0,LONGUEUR_GRAND_BRAS);
    glColor3ub(255,0,0);
    glVertex2d(LARGEUR_GRAND_BRAS,LONGUEUR_GRAND_BRAS);
    glColor3ub(255,0,0);
    glVertex2d(LARGEUR_GRAND_BRAS,0);
    glEnd();


    glTranslated(LARGEUR_GRAND_BRAS/2-LARGEUR_PETIT_BRAS/2,LONGUEUR_GRAND_BRAS,0);
    glRotated(petit_angle,0,0,1);

    glBegin(GL_QUADS);
    glColor3ub(255,0,0);
    glVertex2d(0,0);
    glColor3ub(255,0,0);
    glVertex2d(0,LONGUEUR_PETIT_BRAS);
    glColor3ub(255,0,0);
    glVertex2d(LARGEUR_PETIT_BRAS,LONGUEUR_PETIT_BRAS);
    glColor3ub(255,0,0);
    glVertex2d(LARGEUR_PETIT_BRAS,0);
    glEnd();


    glTranslated(LARGEUR_PETIT_BRAS/2,LONGUEUR_PETIT_BRAS,0);
    glRotated(-grand_angle-petit_angle,0,0,1);

    glBegin(GL_LINES);
    glColor3ub(255,0,0);
    glVertex2d(0,0);
    glColor3ub(255,0,0);
    glVertex2d(0,-longueur);
    glEnd();

    glTranslated(-COTE_CAISSE/2,-longueur-COTE_CAISSE,0);



    glBegin(GL_QUADS);
    glColor3ub(255,0,0);
    glVertex2d(0,0);
    glColor3ub(255,0,0);
    glVertex2d(0,COTE_CAISSE);
    glColor3ub(255,0,0);
    glVertex2d(COTE_CAISSE,COTE_CAISSE);
    glColor3ub(255,0,0);
    glVertex2d(COTE_CAISSE,0);
    glEnd();
    //dessinerRepere(50);


}
void dessinerRepere(unsigned int echelle = 1)
{
    glPushMatrix();
    glScalef(echelle,echelle,echelle);
    glBegin(GL_LINES);
    glColor3ub(0,0,255);
    glVertex2i(0,0);
    glVertex2i(1,0);
    glColor3ub(0,255,0);
    glVertex2i(0,0);
    glVertex2i(0,1);
    glEnd();
    glPopMatrix();
}

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("On dirait pas, mais c'est une grue!",NULL);
    SDL_EnableKeyRepeat(10,10);
    bool continuer = true;
    SDL_Event event;

    SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL);

    int longueur=50;
    int grand_angle=-40;
    int petit_angle=-60;
    while (continuer)
    {

        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity( );

        gluOrtho2D(0,LARGEUR_ECRAN,0,HAUTEUR_ECRAN);

        dessinerGrue(longueur,petit_angle,grand_angle);
        glFlush();
        SDL_GL_SwapBuffers();


        SDL_WaitEvent(&event);
        switch(event.type)
        {
        case SDL_QUIT:
            continuer = false;
            break;
        case SDL_KEYDOWN:
            switch (event.key.keysym.sym)
            {
            case SDLK_UP:
                longueur --;
                if (longueur < 30)
                    longueur = 30;
                break;
            case SDLK_DOWN:
                longueur ++;
                if (longueur > 100)
                    longueur = 100;
                break;
            case SDLK_LEFT:
                if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                {
                    grand_angle++;
                    if(grand_angle>0)
                        grand_angle=0;
                }
                else
                    petit_angle--;
                if(petit_angle<-90)
                    petit_angle=-90;
                break;
            case SDLK_RIGHT:
                if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                {
                    grand_angle--;
                    if(grand_angle<-45)
                        grand_angle=-45;
                }

                petit_angle++;
                if(petit_angle>-45)
                    petit_angle=-45;

                break;
            default:
                break;

            }
        }
    }
    SDL_Quit();

    return 0;
}
